﻿/***
  \brief  КЛассы для хранения категорий английских слов. Сборок слов по смыслу.
  
*/


#pragma once



#include <iostream>
#include <math.h>
#include <stdlib.h>

#include "Error.h"
#include "dict.h"
#include "core_api.h"

#include "VectorDll.h"

//-------------------------------------------------------------------------

//! \brief рейтинг категории
struct  CORE_API CategoryReiting_e
 {
	enum e
	{
		undefined = 0,

		very_height,
		height,
		average,
		low,
		very_low
	};

	e value;

	CategoryReiting_e()
	{
		value = undefined;
	}

	void operator = (const e& val)
	{
		value = val;
	}

	bool operator == (const e& val)	const
	{
		return value == val;
	}

	void to_cstr(char* dest) const;	// CategoryReiting
	bool from_cstr(const char* str);

	void operator = (const std::string& a) throw (Error)
	{
		if( from_cstr(a.c_str()) == false )
		{
			throw Error("Ошибка присваивания значения из строки классу CategoryReiting");
		}
	}

	operator std::string() const 
	{
		char temp[128];
		to_cstr(temp);
		return std::string(temp);
	}
};

//-------------------------------------------------------------------------------

//! \brief Категория англ. слов.   Список слов обединённый в категорию, имеет вес (значение). 
class  CORE_API Category
{
private:

	std::wstring m_filepath;

	//! \brief для внутр. использования. основные данные (заголовок) категории
	struct CORE_API category_data_s
	{
		UINT version_number;
		CategoryReiting_e  reiting;
		std::string brief;

		category_data_s()
		{
			version_number = 0xffffffff;
			//reiting = CategoryReiting::undefined
			brief = "?";
		}
	};

	category_data_s  m_category_data_s;

	//PtrAuto< std::vector< std::string > >  m_words;
	//VectorDLL< std::vector< std::string > >	m_words ;
	VectorDLL< std::string > m_words;



   void Sort();
   static bool readKeyValue(std::string& key, std::string& value, const std::string& line);

public:
	  
	 
	Category(const WCHAR* filepath) throw(Error);
	virtual ~Category();

	//! \brief  получить  ваажность категории в языке
	CategoryReiting_e  GetCategoryReiting() const;
	//! \brief   получить номер версии файла
	UINT GetVersionNumber() const;
	//! \brief  Получить краткое описание.
	std::string GetBrief() const;


	//! \brief Загрузить
	void Load() throw(Error);
	//! \brief СОхранить 
	void Save() throw(Error);

	//! \brief ПОлучить кол-во слов.
	size_t GetNumWords() const;
	
	bool IsWordExists(const char* engWord) const;
	
	std::string GetWord(const size_t index) const; 
	bool GetWord2(char* dest, int destsize, const size_t index) const; 	
	

};

//-----------------------------------------------------------------------------------------------------

//! \brief  список категорий.
class  CORE_API CategoryList
{
private:

	PtrAuto< std::vector< Category* > > m_vector;
	

public:

	 CategoryList(const WCHAR* directory)  throw (Error);
	~CategoryList();
	
	//! \brief Сколько категорий в списке
	UINT GetSize() const;

	Category* GetCategory(const size_t index);
	const Category* GetCategory(const size_t index) const;	

	//-------------------------

	// //! \brief поиск слова в категориях.
	// bool SearchWordInCategories(std::vector<Category*>& dest, const char* word);


};



// end file 